<?php
/**
 * @Descript:模型基础类
 * @Last Modified by:   blue
 */
namespace app\common\model;

use think\Exception;
use think\Model;
use think\Request;
//引入验证器层的命名空间
use  aop\validate;
// use traits\model\SoftDelete;

class Curd extends Model{
    // use SoftDelete;
	// 数据表名称
    protected $table;
    // 数据表主键 复合主键使用数组定义 不设置则自动获取
    protected $pk;
    // 验证器类名,为命名空间加类名格式\aop\BaseValidate
    protected $validates;
    // 更新允许的字段,数组形式
    protected $updateFields=true;
    // 添加允许的字段,数组形式
    protected $insertFields=true;
    protected static function init(){
        //增加前置事件
        self::beforeInsert(function($model){
            if(method_exists($model,'before_insert')){
                return $model->before_insert();
            }
        });
        //增加后置事件
        self::afterInsert(function($model){
            if(method_exists($model,'after_insert')){
                return $model->after_insert();
            }
        });
        //更新前置事件
        self::beforeUpdate(function($model){
            if(method_exists($model,'before_update')){
                return $model->before_update();
            }
        });
        // 更新后置事件
        self::afterUpdate(function($model){
            if(method_exists($model,'after_update')){
                return $model->after_update();
            }
        });
        //删除前置事件
        self::beforeDelete(function($model){
            if(method_exists($model,'before_delete')){
                return $model->before_delete();
            }
        });
        // 删除后置事件
        self::afterDelete(function($model){
            if(method_exists($model,'after_delete')){
                return $model->after_delete();
            }
        });

    }
    protected function initialize(){
        //是不是在行为中判断更恰当?
        // 验证登录

        // 初始化模型验证层
        $this->validates=isset($this->validates)?$this->validates:'\think\Validate';
        $this->pk=isset($this->pk)?$this->pk:'id';
        // 这个放在后面执行比较合理
        parent::initialize();

    }
    //------------------模型验证钩子函数------------------
    protected function before_insert(){}
    protected function after_insert(){}
    protected function before_update(){}
    protected function after_update(){}
    protected function before_delete(){}
    protected function after_delete(){}
    //-----------------通用登录验证方法-------------------


    /**
     * 数据添加通用模型
     * @param 数据
     * @return array 数组
     */
    public function add($data){
        $res=$this->allowField($this->insertFields)->save($data);
        if($res){
            return ['status'=>'success','msg'=>'执行成功','data'=>$res];
        }else{
            return ['status'=>'error','msg'=>$this->getError()];
        }
    }

    /**
     * 编辑操作模型
     * @param string $validateScene
     * @return array
     * @throws Exception
     */
    public function edit($data){
        $res=$this->allowField($this->updateFields)->save($data,$data["$this->pk"]);
        if($res){
            return ['status'=>'success','msg'=>'执行成功','data'=>$res];
        }else{
            return ['status'=>'error','msg'=>$this->getError()];
        }
    }

    /**
     * 显示通用方法
     * @param array 查询条件
     * @param string 分页数量
     * @return array 状态数组
     */
    public function show($where=[],$pagesize=''){
        // 组合search条件
        if(method_exists(__CLASS__,'search')){
            $this->search();
        }
        //如果设置了分页,则进行分页显示,否则不分页显示
        if(!$pagesize){
            $data=$this->where($where)->paginate($pagesize);
        }
        $data=$this->where($where)->select();
        if(empty($data)){
            return ['status'=>'error','msg'=>'没有数据'];
        }
        return ['status'=>'success','msg'=>'查询成功','data'=>$data];
    }

    /**
     * 硬删除
     * @return [type] [description]
     */
    public function del($data){
        $where[$this->pk]=$data;
        $res=$this->where($where)->delete();
        if($res){
            return ['status'=>'success','msg'=>'操作成功','data'=>$res];
        }else{
            return ['status'=>'error','msg'=>$this->getError()];
        }
    }
    /**
     * 软删除
     * @return [type] [description]
     */
    public function softDel(){
    // 获取数据

    }

    /**
     * 列表显示前置搜索条件组合方法
     * @return [where] [数组]
     */
    protected function search(){
        // 非删除状态的列表
        // $cate=I('get.category');
        // //接收参数
        // if($cate){
        //     $d=M('category')->select();
        //     $cates=\CodeBase\Libs\Tree::unlimited_child($d,'pid',$cate);
        //     $cates[]=$cate;
        //     $where['a.cid']=['in',$cates];
        // }
        // $keys=I('get.keys');
        // if($keys){
        //     $where['a.title']=array('like',"%$keys%");
        // }
        // $btime=strtotime(I('get.btime'));
        // $etime=strtotime(I('get.etime'));
        // if($btime&&$etime){
        //     $where['addtime']=['between',[$btime,$etime]];
        // }elseif ($btime){
        //     $where['addtime']=['egt',$btime];
        // }elseif ($etime){
        //     $where['addtime']=['elt',$etime];
        // }
        // $istop=I('get.is_top');
        // $isshow=I('get.is_show');
        // if($istop)  $where['a.is_top']=$istop;
        // if($isshow) $where['a.is_show']=$isshow;
        // $where['is_delete']=0;
    }
}